package com.mechinn.android.ouralliance.fragment; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.activeandroid.query.Select; import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.components.Legend; import com.github.mikephil.charting.data.BarEntry; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.data.LineDataSet; import com.mechinn.android.ouralliance.Prefs; import com.mechinn.android.ouralliance.R; import com.mechinn.android.ouralliance.activity.AnalysisActivity; import com.mechinn.android.ouralliance.data.EventTeam; import com.mechinn.android.ouralliance.data.GraphDataSet; import com.mechinn.android.ouralliance.data.MatchScouting; import com.mechinn.android.ouralliance.data.OurAllianceObject; import com.mechinn.android.ouralliance.data.TeamGraph; import com.mechinn.android.ouralliance.data.TeamScouting; import java.util.ArrayList; import java.util.Collections; import java.util.List; import de.greenrobot.event.EventBus; import de.greenrobot.event.util.AsyncExecutor; import timber.log.Timber; /** * Created by mechinn on 3/15/15. */ public abstract class AnalysisFragment extends Fragment { public static final String TAG = "TeamAnalysisFragment"; private LineChart chart; private Prefs prefs; private ArrayList<Graph> teamGraphs; private ArrayList<Graph> matchGraphs; private ArrayList<TeamGraph> teams; private ArrayList<GraphDataSet> dataSets; public class Graph { private String label; private GraphGetter getter; private int color; public Graph(String label, int color, GraphGetter getter) { this.label = label; this.color = getResources().getColor(color); this.getter = getter; } public String getLabel() { return label; } public GraphGetter getGetter() { return getter; } public int getColor() { return color; } } public abstract class GraphGetter<O extends OurAllianceObject> { public abstract Object getter(O scouting); public BarEntry barEntry(O scouting, int count) { return new BarEntry(getValue(scouting),count); } public float getValue(O scouting) { return getFloat(this.getter(scouting)); } private float getFloat(Object obj) { float value = 0; if(null!=obj) { if(obj instanceof Boolean) { value = ((Boolean)obj)?1:0; } else if(obj instanceof Integer) { value = ((Integer)obj).floatValue(); } else if(obj instanceof Float) { value = ((Float)obj).floatValue(); } else if(obj instanceof Double) { value = ((Double)obj).floatValue(); } } return value; } } public Prefs getPrefs() { return prefs; } public ArrayList<Graph> getTeamGraphs() { return teamGraphs; } public void addTeamGraph(String label, int color, GraphGetter getter) { this.teamGraphs.add(new Graph(label,color,getter)); } public ArrayList<Graph> getMatchGraphs() { return matchGraphs; } public void addMatchGraph(String label, int color, GraphGetter getter) { this.matchGraphs.add(new Graph(label, color, getter)); } public void addTeam(String team) { teams.add(new TeamGraph(getPrefs().getYear(),team,true)); } public ArrayList<TeamGraph> getTeams() { return teams; } public void addTeamDataSet(GraphDataSet graphDataSet) { dataSets.add(graphDataSet); } public void addMatchDataSet(GraphDataSet graphDataSet) { dataSets.add(graphDataSet); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); prefs = new Prefs(this.getActivity()); teams = new ArrayList<>(); teamGraphs = new ArrayList<>(); matchGraphs = new ArrayList<>(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View rootView = inflater.inflate(R.layout.fragment_analysis, container, false); chart = (LineChart) rootView.findViewById(R.id.chart); chart.setDragEnabled(true); chart.setScaleXEnabled(true); chart.setScaleYEnabled(false); chart.setPinchZoom(true); chart.setHighlightEnabled(true); chart.setHighlightIndicatorEnabled(true); chart.animateXY(3000, 3000); return rootView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); setRetainInstance(true); } @Override public void onStart() { super.onStart(); Timber.d("start"); EventBus.getDefault().register(this); dataSets = new ArrayList<>(); loadTeamList(); } public void onStop() { Timber.d("stop"); EventBus.getDefault().unregister(this); super.onStop(); } public void loadData() { AsyncExecutor.create().execute(new AsyncExecutor.RunnableEx() { @Override public void run() throws Exception { loadTeam(); loadMatch(); } }); } public void onEventMainThread(AnalysisActivity.AnalysisNavigationSelected navigationSelected) { setChartData(); } public void loadTeamList() { AsyncExecutor.create().execute(new AsyncExecutor.RunnableEx() { @Override public void run() throws Exception { List<EventTeam> scouting = new Select().from(EventTeam.class).where(EventTeam.TAG + "." + EventTeam.EVENT + "=?", getPrefs().getComp()).execute(); EventBus.getDefault().post(new LoadEventTeams(scouting)); } }); } public void onEventMainThread(LoadEventTeams loadTeams) { List<EventTeam> teamList = loadTeams.getTeams(); Collections.sort(teamList); for (int count = 0; count < teamList.size(); count++) { EventTeam team = teamList.get(count); addTeam(String.valueOf(team.getTeam().getTeamNumber())); } EventBus.getDefault().post(new TeamsLoaded(getTeams())); loadData(); } public class LoadEventTeams { List<EventTeam> teams; public LoadEventTeams(List<EventTeam> teams) { this.teams = teams; } public List<EventTeam> getTeams() { return teams; } } public abstract void loadTeam(); public abstract void loadMatch(); public class DataSetLoaded { private ArrayList<GraphDataSet> dataSet; public DataSetLoaded(ArrayList<GraphDataSet> dataSet) {this.dataSet = dataSet;} public ArrayList<GraphDataSet> getDataSet() {return dataSet;} } public class TeamsLoaded { private ArrayList<TeamGraph> teams; public TeamsLoaded(ArrayList<TeamGraph> teams) {this.teams = teams;} public ArrayList<TeamGraph> getTeams() {return teams;} } protected void loadedChartData() { EventBus.getDefault().post(new DataSetLoaded(dataSets)); setChartData(); } public void setChartData() { Timber.d("teams "+teams.size()); ArrayList<LineDataSet> enabledSets = new ArrayList<>(); for(GraphDataSet set : dataSets) { Timber.d(set.getDataSet().getLabel()+" "+set.getDataSet().getEntryCount()+" "+(set.isEnabled()?"Enabled":"Disabled")); if(set.isEnabled()) { enabledSets.add(set.getDataSet()); } } for(int teamPosition=teams.size()-1;teamPosition>=0;teamPosition--) { TeamGraph team = teams.get(teamPosition); Timber.d(team.getLabel()+" "+(team.isEnabled()?"Enabled":"Disabled")); if(!team.isEnabled()) { for(LineDataSet set : enabledSets) { set.removeEntry(teamPosition); } } } ArrayList<String> enabledTeams = new ArrayList<>(); for(int teamPosition=0;teamPosition<teams.size();teamPosition++) { TeamGraph team = teams.get(teamPosition); Timber.d(team.getLabel()+" "+(team.isEnabled()?"Enabled":"Disabled")); if(team.isEnabled()) { enabledTeams.add(team.getLabel()); } } chart.setData(new LineData(enabledTeams,enabledSets)); Legend l = chart.getLegend(); l.setPosition(Legend.LegendPosition.RIGHT_OF_CHART_CENTER); chart.invalidate(); } protected class LoadTeams { List<? extends TeamScouting> scouting; public LoadTeams(List<? extends TeamScouting> scouting) { this.scouting = scouting; } public List<? extends TeamScouting> getScouting() { return scouting; } } protected class LoadMatches { List<? extends MatchScouting> scouting; public LoadMatches(List<? extends MatchScouting> scouting) { this.scouting = scouting; } public List<? extends MatchScouting> getScouting() { return scouting; } } }